namespace moduleName {
// 如果要在命名空间以外使用内部成员，就必须为该成员加上export前缀，表示对外输出该成员。
//   多个同名的 namespace 会自动合并，这一点跟 interface 一样。
    export interface student {
        name: string;
        age: number;
    }
}

const major: moduleName.student = {
    name: "da",
    age: 23,
};


namespace App {
    // import别名
    import isString = moduleName.student;

    const app: isString = {
        name: "sachin",
        age: 23,
    };

}


// ，命名空间不允许同名的导出
// namespace A {
//     export type lao = string
// }
//
//  namespace A {
//     export type lao = string
// }


// 命名空间与类的导出  类在命名空间前   类中的函数会挂在到prototype中   命名空间被挂载到构造函数上成为静态成员
class bbPerson {
    hi() {
        console.log('hellow');

    }
}

namespace bbPerson {
    export const dfdskjkj = 'sachin'

    export function getAage() {
        return 23
    }
}
const psda = new bbPerson()
console.dir(psda);


class Pp {
    static uname: string
    age: number

    constructor(age: number, uname: string) {
        this.age = age
    }

    static getName() {
        return Pp.uname
    }

    getAge() {
        return this.age
    }

}

const zksse = new Pp(23, 'sachin')
console.dir(zksse)

type PpInstance = InstanceType<typeof Pp>

type PpStatic = typeof Pp

let cce: PpStatic  //访问该类的静态属性
let dde: PpInstance  //访问该类的实例属性

dde.getAge()

cce.getName()


// 命名空间与函数 可以使用命名空间的参数
function zz2() {
    zz2.countSpace++
    console.log(zz2.countSpace)

}

namespace zz2 {
    export let countSpace: number = 0
}
zz2()


// 命名空间和枚举 合并
enum Colosr {
    red,
    blue
}

namespace Colosr {
    export const yellow = 3
}
console.log(Colosr.yellow)


// 命名空间嵌套
namespace App {
    export namespace Models {
        export interface User {
            id: number;
            name: string;
        }
    }

    export namespace Services {
        export function getUser(): Models.User {
            return {id: 1, name: "张三"};
        }
    }
}
// 使用 Models.User 类型声明一个变量
const user: App.Models.User = {
    id: 123,
    name: "李四",
};

// 调用 Services 里的函数获取 User 对象
const fetchedUser = App.Services.getUser();

console.log(fetchedUser.id, fetchedUser.name); // 输出：1 张三
